package Negocios;

import java.util.ArrayList;

import DTO.DTONuevaCompetencia;
import Excepcion.CantidadDePuntosInvalidoException;
import Excepcion.DeporteVacioException;
import Excepcion.ModalidadVacioException;
import Excepcion.NombreCaracterException;
import Excepcion.NombreCompetenciaExistenteException;
import Excepcion.PuntajeImposibleException;
import Excepcion.TamReglamentoInvalidoException;
import Persistencia.DAO.DAOCompetencia;
import Persistencia.DAO.DAOUsuario;
import Persistencia.Entidad.Competencia;
import Persistencia.Entidad.Deporte;
import Persistencia.Entidad.Disponibilidad;
import Persistencia.Entidad.EstadoDeCompetencia;
import Persistencia.Entidad.FormaDePuntuacion;
import Persistencia.Entidad.LugarDeCompetencia;
import Persistencia.Entidad.ModalidadDeCompetencia;
import Persistencia.Entidad.Reglamento;
import Persistencia.Entidad.Usuario;

public class ControlCompetencia {
	
	public void crearCompetencia(DTONuevaCompetencia nuevaCompetencia) throws
		NombreCompetenciaExistenteException, NombreCaracterException, 
		DeporteVacioException, ModalidadVacioException, TamReglamentoInvalidoException, CantidadDePuntosInvalidoException, 
		PuntajeImposibleException {
		validarDTONuevaCompetencia(nuevaCompetencia);
		
		DAOUsuario daoUsuario = new DAOUsuario();
		
		Usuario usuario = daoUsuario.getUsuario(nuevaCompetencia.getIdUsuario());
		
		if (!usuario.existeCompetencia(nuevaCompetencia.getNombreCompetencia())) {
			Competencia competencia = new Competencia(nuevaCompetencia.getNombreCompetencia(), usuario);
			
			DAOCompetencia daoCompetencia = new DAOCompetencia();
			Deporte deporte = daoCompetencia.getDeporte(nuevaCompetencia.getIdDeporte());
			ModalidadDeCompetencia modalidad = daoCompetencia.getModalidad(nuevaCompetencia.getIdModalidad());
			
			competencia.setDeporte(deporte);
			competencia.setModalidadDeCompetencia(modalidad);
			
			Reglamento reglamento = null;
			
			if (!nuevaCompetencia.getReglamento().isEmpty()) {
				reglamento = new Reglamento(nuevaCompetencia.getReglamento());
				competencia.setReglamento(reglamento);
			}
			
			ArrayList<ArrayList<Integer>> idLugares = nuevaCompetencia.getLugares();
			
			for (int n = 0; n < idLugares.size(); n++) {
				 LugarDeCompetencia lugar = daoCompetencia.getLugarDeCompetencia(idLugares.get(n).get(0));
				 Disponibilidad disponibilidad= new Disponibilidad(lugar, idLugares.get(n).get(1));
				 competencia.addDisponibilidad(disponibilidad);
			}
			
			FormaDePuntuacion formaDePuntuacion;
			if(nuevaCompetencia.getSets()!=-1){
				formaDePuntuacion = daoCompetencia.getFormaDePuntuacion(FormaDePuntuacion.SETS);
			}
			else 
				if(nuevaCompetencia.getPuntuacion() != -1)
					formaDePuntuacion = daoCompetencia.getFormaDePuntuacion(FormaDePuntuacion.PUNTUACION);	
				else 
					formaDePuntuacion = daoCompetencia.getFormaDePuntuacion(FormaDePuntuacion.RESULTADO_FINAL);
			
			competencia.setReglasDePuntuacion(formaDePuntuacion, nuevaCompetencia.getPuntosPorVictoria(),
					nuevaCompetencia.getPuntosPorEmpate(), nuevaCompetencia.getSets(),
					nuevaCompetencia.getPuntosPorPresencia(),nuevaCompetencia.getPuntosPorAusencia());
			
			EstadoDeCompetencia estadoCreada = daoCompetencia.getEstadoDeCompetencia(EstadoDeCompetencia.CREADA);
			competencia.setEstadoDeCompetencia(estadoCreada);
			
			usuario.addCompetencia(competencia);
			
			daoUsuario.updateUsuario(usuario);
			
			if (reglamento != null) {
				reglamento.setCompetencia(competencia);
				daoCompetencia.saveReglamento(reglamento);
			}
		}
		else {
			throw new NombreCompetenciaExistenteException(nuevaCompetencia.getNombreCompetencia());
		}
	}
	
	private void validarDTONuevaCompetencia(DTONuevaCompetencia competencia) throws NombreCaracterException,
		DeporteVacioException, ModalidadVacioException, TamReglamentoInvalidoException, CantidadDePuntosInvalidoException,
		PuntajeImposibleException {
		ValidacionString.validarNombreCompetencia(competencia.getNombreCompetencia());
		ValidacionString.validarDeporteVacio(competencia.getIdDeporte());
		ValidacionString.validarModalidadVacio(competencia.getIdModalidad());
		ValidacionString.validarReglamento(competencia.getReglamento());
		ValidacionString.validarPuntuacionMenos1(competencia.getPuntosPorVictoria());
		ValidacionString.validarPuntuacionMenos1(competencia.getPuntosPorEmpate());
		ValidacionString.validarPuntuacionMenos1(competencia.getPuntosPorPresencia());
		ValidacionString.validarPuntuacionMenos1(competencia.getPuntuacion());
		ValidacionString.validarPuntuacionMenos1(competencia.getSets());
		ValidacionString.validarPuntuacionMenos1(competencia.getPuntosPorAusencia());
	}
	
	public boolean esFormaPuntuacion(int idCompetencia) {
		return new DAOCompetencia().getCompetencia(idCompetencia).esPuntuacion();
	}
	
}